package com.xli.dto.component.model.query;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xli.dto.component.view.View;
import com.xli.dto.search.SearchDTO;
import com.xli.dto.search.type.QueryType;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;

@Slf4j
public abstract class Query<E, D extends SearchDTO> implements View {

    public QueryWrapper<E> buildQueryWrapper(D dto) {
        QueryWrapper<E> queryWrapper = new QueryWrapper<>();

        if (dto != null) {
            Field[] fields = dto.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                QueryType queryType = field.getAnnotation(QueryType.class); // 获取字段上的查询类型注解
                if (queryType != null && StrUtil.isNotBlank(queryType.field())) {
                    try {
                        Object value = field.get(dto);  // 获取字段值
                        if (value != null && !"".equals(value)) {
                            // 根据查询类型选择适当的条件
                            switch (queryType.value()) {
                                case LIKE:
                                    queryWrapper.like(queryType.field(), value);
                                    break;
                                case LEFT_LIKE:
                                    queryWrapper.likeLeft(queryType.field(), value);
                                    break;
                                case RIGHT_LIKE:
                                    queryWrapper.likeRight(queryType.field(), value);
                                    break;
                                case EQ:
                                    queryWrapper.eq(queryType.field(), value);
                                    break;
                            }
                        }
                    } catch (IllegalAccessException e) {
                        log.error(e.getMessage(), e);
                    }
                }
            }
            if (StrUtil.isNotBlank(dto.getSort()) && StrUtil.isNotBlank(dto.getFilter())) {
                boolean isAscend = "asc".equals(dto.getSort());
                queryWrapper.orderBy(true, isAscend, dto.getFilter());
            }
        }

        return queryWrapper;
    }
}
